Struts中OGNL

一、OGNL概念

OGNL(Object Graph Navigation Language),即对象图导航语言,是一种功能强大的表达式语言,可以任意存取对象的属性或者调用对象的方法。

OGNL表达式的计算是围绕OGNL上下文进行的,OGNL上下文实际上是一个Map对象,由ognl.Context类来表示,它里面可以存放很多个JavaBean对象,它有一个上下文根对象,上下文中的根对象可以直接使用名来访问或直接使用它的属性名来访问它的属性值,否则要加前缀”#key”。

Struts的标签库都是使用OGNL表达式来访问ActionContext中的对象数据的。

Struts将ActionContext设置为OGNL上下文,并将值栈作为OGNL的根对象放置到ActionContext中。

二、值栈

访问值栈中的对象不用“#”,Struts总是将当前Action实例放置在栈顶,所以在OGNL中引用Action中的属性也不需要“#”。

三、OGNL中三个重要的符号:#、%、$

3.1 #符号

  • 1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    - 访问非根对象属性,例如#session.msg表达式,由于Struts中值栈被视为根对象,所以访问其他非根对象时,需要加#前缀,实际上#相当于ActionContext.getContext(),#session.msg 表达式相当于ActionContext.getContext().getSession().getAttribute("msg");
    - 用于过滤和投影集合,如persons.{?#this.age>25}, persons.{?#this.name=="pla1"}.{age}[0];
    - 用于构造map,例如#{'foo1':'bar1', 'foo2':'bar2'}。
    | 名称 | 作用 | 例子 |
    | ----------- | --------------------------------------- | ---------------------------------------- |
    | parameters | 包含当前HTTP请求的Map | ```#parameters.id[0]=request.getParameter("id")``` |
    | request | 包含当前HttpServletRequest属性的Map | ```#request.username=request.getAttribute("username")``` |
    | session | 包含当前HttpSession属性的Map | ```#session.username=session.getAttribute("username")``` |
    | application | 包含当前ServletContext属性的Map | ```#application.username=application.getAttribute("username")``` |
    | attr | 用于按照request>session>application的顺序访问其属性 | ```#attr.username```相当于按照顺序在以上三个范围内读取username的属性,直到找到为止 |
    注意:也可以写成#request['username'] #session['username'] #application['username']
    ### 3.2 %符号
    %符号的用途是在标志的属性为字符串类型时,计算OGNL表达式的值,即在struts字符串中用%{}指出,其内部是一个OGNL表达式,需要解析,例如:
    ```jsp
    <h3>构造Map</h3>
    <s:set name="foobar" value="#{'foo1':'bar1','foo2':'bar2'}"/>
    <p>The value of key "fool" is <s:property value="#foobar['foo1']"/></p>
    <p>不使用%:<s:url value="#foobar['foo1']"/></p>
    <p>使用%:<s:url value="%{#foobar['foo1']}"/></p>

运行结果如下:

1
2
3
the value of key "fool" is bar1
不使用%:#foobar['foo1']
使用%:bar1

3.3 $符号

$符号有两个用途:

  • 在国际化资源文件中,引用OGNL表达式,例如国际化资源文件中的代码:reg.agerange=国际化资源信息:年龄必须在${min}${max}之间
  • 在Struts 框架的配置文件中引用OGNL表达式。